/**
 * 转换后台数据符合TreeData的格式
 * @param {Array} rootData 顶级节点数组
 * @param {Array} list 全部数据数组
 * @param {Function} filter 筛选出指定节点的子节点方法
 * @param {Function} handleItem 自定义处理节点
 * @param {Boolean} excludeRoot 是否排除顶级节点
 */
import el from 'element-ui/src/locale/lang/el'

export function parseTreeData(rootData, list, filter, handleItem, excludeRoot) {
  rootData.forEach(function(node) {
    node.children = list.filter(item => {
      return filter(item, node)
    })
    if (node.children.length === 0) {
      node.children = undefined
    } else {
      parseTreeData(node.children, list, filter, handleItem)
    }
    typeof handleItem === 'function' && handleItem(node)
  })
  // 默认第一层固定的不要
  if (excludeRoot) {
    return rootData[0].children
  }
  return rootData
}

/**
 * 多个异步操作模拟同步处理操作
 * @param {Object} options 配置
 */
export function batchHandle(options) {
  // 默认配置
  const defaultOptions = {
    vm: undefined, // vue实例
    vmNotify: false, // 操作命令
    opName: '删除', // 操作命令
    data: [], // 数据
    delData: [], // 被删除数据
    opHandle: function(val, resolve, reject) { resolve() },
    delHandle: function(val, resolve, reject) { resolve() },
    beginCallback() {}, // 初始化操作之后
    finishCallback(successCount, failCount) {}, // 完成之后的回调
    intervalTime: 300 // 检测时间间隔
  }
  // 合并配置
  typeof options === 'object' && (Object.assign(defaultOptions, options))
  // 处理成功数量
  let successCount = 0
  // 处理失败数量
  let failCount = 0
  const opDataLength = defaultOptions.data.length + defaultOptions.delData.length
  defaultOptions.vm.$confirm('是否批量' + defaultOptions.opName + '选择的共 ' + opDataLength + ' 条数据？', '警告', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  }).then(() => {
    typeof defaultOptions.beginCallback === 'function' && defaultOptions.beginCallback()

    // 循环处理数据，具体的处理逻辑是传进来的opHandle方法
    if (defaultOptions.data.length > 0) {
      defaultOptions.data.forEach(function(val) {
        // 使用Promise方便统计成功和失败数量
        new Promise((resolve, reject) => {
          defaultOptions.opHandle(val, resolve, reject)
        }).then(() => {
          successCount++
        }).catch(() => {
          failCount++
        })
      })
    }

    if (defaultOptions.delData.length > 0) {
      defaultOptions.delData.forEach(function(val) {
        // 使用Promise方便统计成功和失败数量
        new Promise((resolve, reject) => {
          defaultOptions.delHandle(val, resolve, reject)
        }).then(() => {
          successCount++
        }).catch(() => {
          failCount++
        })
      })
    }

    // 使用setInterval来定时循环监控是否全部完成
    const intervalId = setInterval(function() {
      if ((successCount + failCount) === (defaultOptions.data.length + defaultOptions.delData.length)) {
        clearInterval(intervalId)
        typeof defaultOptions.finishCallback === 'function' && defaultOptions.finishCallback(successCount, failCount)
        // eslint-disable-next-line no-empty
        if (defaultOptions.vmNotify) {
          defaultOptions.vm.$notify({
            title: '通知',
            message: '本次共' + defaultOptions.opName + '成功 ' + successCount + ' 条数据, ' + defaultOptions.opName + '失败 ' + failCount + ' 条数据!',
            type: 'success',
            duration: 2000
          })
        } else {
          defaultOptions.vm.$alert('本次共' + defaultOptions.opName + '成功 ' + successCount + ' 条数据, ' + defaultOptions.opName + '失败 ' + failCount + ' 条数据!', '提示')
        }
      }
    }, defaultOptions.intervalTime)
  }).catch()
}
